library(tableone)
Warning: package ‘tableone’ was built under R version 4.2.3
# Note that there's a package that does this smoothly. Need to add it as an alternative at some point

#columnNames<-read.csv("../01-RawData/MHHS-1_12202023.csv",header=FALSE)[1,]

#qual_data<-read.csv("../01-RawData/MHHS-1_12202023.csv",header=FALSE,col.names = columnNames)[-c(1:3),]

# write a new version that can be reimported with the proper column classes
#write.csv(qual_data,"../04-ProcessedData/MHHS-1_12202023_cleanheader.csv",row.names=FALSE)
save(mhhs_demotbl,"../04-ProcessedData/Demotable.RDS")
Error in save(mhhs_demotbl, "../04-ProcessedData/Demotable.RDS") : 
  object ‘../04-ProcessedData/Demotable.RDS’ not found

PROMIS_Global v1.2

To score the PROMIS_Global: First check if survey coded Excellent as 1 or as 5. Qualtrics will often reverse them. Higher scores should reflect better functioning.

PROMIS_Global1_1:PROMIS_Global1_7: Items rated from 5 (excellent) to 1 (Not at all) on original scale; PROMIS_Global1_1:PROMIS_Global1_7 are reversed from Qualtrics 1-5 defaults

PROMIS_Global2_1: emotional problems; past 7 days; 5 (never) to 1 (always); (global 10) PROMIS_Global2_2: fatigue; past 7 days (global 08)

PROMIS_Global3_1: pain. 5=0, 4=1:3, 3=4:6, 2=7:9, 1=10

For scoring, “2 questions were excluded from the calculation/evaluation as a result of the questionnaire development study: Global01 because of its statistical congruence with Global03. Global09r because of its approximately equal statistical correlation to physical and mental health.”

The Global Physical Health score is generated by summing responses to Global03 (PROMIS_Global1_3), Global06 (PROMIS_Global1_7), Global07rescored (PROMIS_Global3_1), and Global08rescored (PROMIS_Global2_2). The Global Mental Health score is generated by summing responses to Global02 (PROMIS_Global1_2), Global04 (PROMIS_Global1_4), Global05(PROMIS_Global1_5), and Global10rescored (PROMIS_Global2_1)

promis_global<-mhhs_data %>% select(contains("PROMIS"))

#score items so that higher scores reflect better functioning 

# pain item: 5=0, 4=1:3, 3=4:6, 2=7:9, 1=10

# renaming the Promis to match the original measure

promis_global<-promis_global %>% rename_with(~sprintf("PROMIS_Global0%d",1:5),.cols=c(PROMIS_Global1_1:PROMIS_Global1_5)) %>%  rename(PROMIS_Global09=PROMIS_Global1_6,PROMIS_Global06=PROMIS_Global1_7, PROMIS_Global10=PROMIS_Global2_1, PROMIS_Global08=PROMIS_Global2_2,PROMIS_Global07=PROMIS_Global3_1)%>% mutate(across(c(PROMIS_Global01:PROMIS_Global08),~6-.)) %>% 
  mutate(PROMIS_Global07=recode(PROMIS_Global07,`0`=5,`1`=4,`2`=4,`3`=4,`4`=3,`5`=3,`6`=3,`7`=2,`8`=2,`9`=2,`10`=1))%>% 
  rowwise() %>%  mutate(PG_PhysHealth=sum(c(PROMIS_Global03,PROMIS_Global06,PROMIS_Global07,PROMIS_Global08)),PG_MentHealth=sum(c(PROMIS_Global02,PROMIS_Global04,PROMIS_Global05,PROMIS_Global10))) %>% ungroup()

promis_global_scoring<-promis_global %>% select(-PROMIS_Global01, -PROMIS_Global09,-PG_PhysHealth,-PG_MentHealth)

key_promis.list<-list(PH=c("PROMIS_Global03","PROMIS_Global06","PROMIS_Global07","PROMIS_Global08"),MH=c("PROMIS_Global02","PROMIS_Global04","PROMIS_Global05","PROMIS_Global10"))

key_promis<-make.keys(nvars=8,key_promis.list,item.labels = colnames(promis_global_scoring))
scales_promis<-scoreItems(key_promis,promis_global_scoring)
summary(scales_promis)

GHSQL

GHSQL has one open-response item. This is not included in the summary score. Scoring also seems somewhat flexible and includes informal/formal; personal-emotional/suicide; help from anyone/Help from no-one.

Range 1-7 (Extremely unlikely to Extremely Likely)

ghsql<-mhhs_data %>% select(contains("GHSQL"))

ghsql<-ghsql %>% mutate(General=rowSums((select(ghsql,GHSQL_Pers_1:GHSQL_Pers_9,GHSQL_SUI_1:GHSQL_SUI_9)))) %>% 
 rowwise() %>%  
  mutate(Personal=sum(c_across(GHSQL_Pers_1:GHSQL_Pers_8)),
         Suicide=sum(c_across(GHSQL_SUI_1:GHSQL_SUI_8)),
         Informal_all=sum(c(GHSQL_Pers_1,GHSQL_SUI_1,GHSQL_Pers_2,GHSQL_SUI_2,GHSQL_Pers_3,GHSQL_SUI_3,GHSQL_Pers_4,GHSQL_SUI_4)),
         Formal_all=sum(c(GHSQL_Pers_5,GHSQL_SUI_5,GHSQL_Pers_6,GHSQL_SUI_6,GHSQL_Pers_7,GHSQL_SUI_7,GHSQL_Pers_8,GHSQL_SUI_8)),
         None_all=sum(c(GHSQL_Pers_9,GHSQL_SUI_9))) %>% 
  ungroup() %>% #remove rowwise grouping 
  mutate(Personal_z=scale(Personal),Suicide_z=scale(Suicide),Informal_all_z=scale(Informal_all),Formal_all_z=scale(Formal_all),None_all_z=scale(None_all))

#make a dataframe with only the items to be scored/that need reliability
ghsql_scoring<-ghsql %>% dplyr::select(1:9,12:20)
key_ghsql.list<-list(General=c(1:18),Personal=c(1:9),Suicide=c(10:18),Formal=c(5,14,6,15,7,16,8,17),Informal=c(1,10,2,11,3,12,4,13))
key_ghsql<-make.keys(18,key_ghsql.list,colnames(ghsql_scoring))

scales_ghsql<-scoreItems(key_ghsql.list,ghsql_scoring)
summary(scales_ghsql)
Call: scoreItems(keys = key_ghsql.list, items = ghsql_scoring)

Scale intercorrelations corrected for attenuation 
 raw correlations below the diagonal, (unstandardized) alpha on the diagonal 
 corrected correlations above the diagonal:
         General Personal Suicide Formal Informal
General     0.78     1.36    1.24   1.07     1.05
Personal    0.87     0.52    1.03   1.16     1.06
Suicide     0.93     0.63    0.72   1.03     1.05
Formal      0.86     0.76    0.80   0.83     0.59
Informal    0.82     0.68    0.79   0.48     0.78
#histogram to explore the range 
ghsql %>% select(GHSQL_Pers_1:GHSQL_Pers_9) %>% gather() %>% ggplot(aes(y=value,x=key)) + geom_boxplot() + scale_x_discrete(labels=c("Intimate partner", "Friend","Parent","Other relative","MHP","Phone helpline","Doctor","Minister","Not seek help"))+ theme(axis.text.x = element_text(angle=90))
Warning: Removed 300 rows containing non-finite values (`stat_boxplot()`).

ghsql %>% select(GHSQL_SUI_1:GHSQL_SUI_9) %>% gather() %>% ggplot(aes(y=value,x=key)) + geom_boxplot() + scale_x_discrete(labels=c("Intimate partner", "Friend","Parent","Other relative","MHP","Phone helpline","Doctor","Minister","Not seek help"))+ theme(axis.text.x = element_text(angle=90))
Warning: Removed 343 rows containing non-finite values (`stat_boxplot()`).

ghsql %>% select(Informal_all_z,Formal_all_z,None_all_z) %>% gather() %>% ggplot(aes(y=value,x=key)) + geom_boxplot() + scale_x_discrete(labels=c("Informal (Pers + Sui)","Formal (Pers + Sui)","None (Pers + Sui)"))+ theme(axis.text.x = element_text(angle=90))
Warning: attributes are not identical across measure variables; they will be dropped
Warning: Removed 178 rows containing non-finite values (`stat_boxplot()`).

ghsql %>% select(GHSQL_Pers_10_TEXT,GHSQL_SUI_10_TEXT) %>% filter(GHSQL_Pers_10_TEXT!=""|GHSQL_SUI_10_TEXT!="")
NA

DASS21

Stress items are 1, 6, 8, 11, 12, 14, 18 Anxiety items are 2, 4, 7, 9, 15, 19, 20,
Depression items are 3, 5, 10, 13, 16, 17, 21

The depression scale assesses dysphoria, hopelessness, devaluation of life, self-deprecation, lack of interest / involvement, anhedonia and inertia.

The anxiety scale assesses autonomic arousal, skeletal muscle effects, situational anxiety, and subjective experience of anxious affect. The stress scale is sensitive to levels of chronic nonspecific arousal. It assesses difficulty relaxing, nervous arousal, and being easily upset / agitated, irritable / over-reactive and impatient.

Scores for depression, anxiety and stress are calculated by summing the scores for the relevant items

Scores on the DASS-21 will need to be multiplied by 2 to calculate the final score and stay equivalent with DASS-42.

dass<-mhhs_data %>% select(contains("DASS"))

dass<-dass %>% mutate(Dass21_Total=rowSums((select(dass,DASS21_1:DASS21_21)))*2) %>% 
 rowwise() %>%  
  mutate(Dass21_Stress=sum(DASS21_1,DASS21_6, DASS21_8,DASS21_11,DASS21_12,DASS21_14,DASS21_18,na.rm = T),
         Dass21_Anxiety=sum(DASS21_2,DASS21_4,DASS21_7,DASS21_9,DASS21_15,DASS21_19,DASS21_20, na.rm=T),
         Dass21_Depression=sum(DASS21_3,DASS21_5,DASS21_10,DASS21_13,DASS21_16,DASS21_17,DASS21_21, na.rm=T)) %>% 
  ungroup() %>%
  mutate(Dass21_Stress_z=scale(.,)) %>%
  mutate(Dep_cuts=case_when(Dass21_Depression<10~"Normal",
                                   Dass21_Depression<14~"Mild",
                                   Dass21_Depression<21~"Moderate",
                                   Dass21_Depression<28~"Severe",
                                   Dass21_Depression>27~"Extremely_Severe"),
                Anx_cuts=case_when(Dass21_Anxiety<8~"Normal",
                                   Dass21_Anxiety<10~"Mild",
                                   Dass21_Anxiety<15~"Moderate",
                                   Dass21_Anxiety<20~"Severe",
                                   Dass21_Anxiety>19~"Extremely_Severe"),
                Stress_cuts=case_when(Dass21_Stress<15~"Normal",
                                   Dass21_Stress<19~"Mild",
                                   Dass21_Stress<26~"Moderate",
                                   Dass21_Stress<34~"Severe",
                                   Dass21_Stress>33~"Extremely_Severe"))


#make a dataframe with only the items to be scored/that need reliability
dass_scoring<-dass %>% dplyr::select(DASS21_1:DASS21_21)
key_dass.list<-list(Stress=c(1,6,8,11,12,14,18),Anxiety=c(2,4,7,9,15,19,20),Depression=c(3,5,10,13,16,17,21))

key_dass<-make.keys(21,key_dass.list,colnames(dass_scoring))

scales_dass<-scoreItems(key_dass.list,dass_scoring)
summary(scales_dass)

#histogram to explore the range 
dass %>% select(Dass21_Stress,Dass21_Anxiety, Dass21_Depression) %>% gather() %>% ggplot(aes(y=value,x=key)) + geom_boxplot() + scale_x_discrete(labels=c("Stress","Anxiety","Depression"))+ theme(axis.text.x = element_text(angle=90))

#scatterplot to color the cutoffs
dass_severity<-dass %>%  select(Dass21_Stress,Dass21_Anxiety, Dass21_Depression) %>% 
pivot_longer(cols=starts_with("Dass21"),names_to = "Subscale",values_to = "score") %>%   mutate(Cuts=case_when((Subscale=="Dass21_Depression" & score<10) ~"Normal",
                       (Subscale== "Dass21_Depression"& score<14)~"Mild",
                       (Subscale== "Dass21_Depression"& score<21)~"Moderate",
                       (Subscale== "Dass21_Depression"& score<28)~"Severe",
                       (Subscale== "Dass21_Depression"& score>27)~"Extremely_Severe",
                       (Subscale=="Dass21_Anxiety"& score<8)~"Normal",
                      (Subscale== "Dass21_Anxiety"& score<10)~"Mild",
                      (Subscale== "Dass21_Anxiety"& score<15)~"Moderate",
                      (Subscale== "Dass21_Anxiety"& score<20)~"Severe",
                      (Subscale== "Dass21_Anxiety"& score>19)~"Extremely_Severe",
                      (Subscale=="Dass21_Stress"& score<15)~"Normal",
                      (Subscale=="Dass21_Stress"& score<19)~"Mild",
                      (Subscale=="Dass21_Stress"& score<26)~"Moderate",
                      (Subscale== "Dass21_Stress"& score<34)~"Severe",
                      (Subscale== "Dass21_Stress"& score>33)~"Extremely_Severe"))

  
#severity histogram colored by severity
dass_scatter %>% ggplot(aes(score,fill=Subscale,group=Subscale))+geom_bar()

#jitter plot colored by severity
dass_scatter %>% ggplot(aes(x=Subscale,y=score,colour=Cuts))+geom_jitter()+theme_classic()+scale_color_brewer(palette = "Set1")

ISMI29

29-item measure assessing self stigma of mental illness. Includes subscales: alienation, stereotype endorsement, discrimination experience, social withdrawal, stigma resistance. Scored from 1-4. The entire Stigma resistance subscale is reverse scored.

Traditional scoring is dichotomous and uses means.

ismi<-mhhs_data %>% select(contains("ISMI"))

ismi<-ismi %>% rowwise() %>%  
  mutate(ISMI_Alientation=sum(ISMI29_1,ISMI29_5,ISMI29_8,ISMI29_16,ISMI29_17,ISMI29_21),
         ISMI_Stere=sum(ISMI29_2, ISMI29_6,ISMI29_10,ISMI29_18,ISMI29_19,ISMI29_23,ISMI29_29),
         ISMI_Discr=sum(ISMI29_3,ISMI29_15,ISMI29_22,ISMI29_25,ISMI29_28),
    ISMI_Withdrawal=sum(ISMI29_4,ISMI29_9,ISMI29_11,ISMI29_12,ISMI29_13,ISMI29_20)) %>% 
      mutate(ISMI29_7=recode(ISMI29_7,`1`=4,`2`=3,`3`=2,`4`=1),
            ISMI29_14=recode(ISMI29_14,`1`=4,`2`=3,`3`=2,`4`=1),
         ISMI29_24=recode(ISMI29_24,`1`=4,`2`=3,`3`=2,`4`=1),
          ISMI29_26=recode(ISMI29_26,`1`=4,`2`=3,`3`=2,`4`=1),
         ISMI29_27=recode(ISMI29_27,`1`=4,`2`=3,`3`=2,`4`=1)) %>%  
      mutate(ISMI_Stigmar=sum(ISMI29_7,ISMI29_14,ISMI29_24,ISMI29_26,ISMI29_27)) %>% 
  ungroup()


#make a dataframe with only the items to be scored/that need reliability
ismi_scoring<-ismi %>% dplyr::select(ISMI29_1:ISMI29_29)
key_ismi.list<-list(Alien=c(1,5,8,16,17,21),Stereotype=c(2,6,10,18,19,23,29),Discrimination=c(3,15,22,25,28),Withdrawal=c(4,9,11,12,13,20),StigmaR=c(7,14,24,26,27))

key_ismi<-make.keys(29,key_ismi.list,colnames(ismi_scoring))

scales_ismi<-scoreItems(key_ismi.list,ismi_scoring)
summary(scales_ismi)
Call: scoreItems(keys = key_ismi.list, items = ismi_scoring)

Scale intercorrelations corrected for attenuation 
 raw correlations below the diagonal, (unstandardized) alpha on the diagonal 
 corrected correlations above the diagonal:
               Alien Stereotype Discrimination Withdrawal StigmaR
Alien           0.81       1.05           1.06       1.07    1.04
Stereotype      0.85       0.80           1.16       1.04    1.30
Discrimination  0.68       0.74           0.51       1.05    1.70
Withdrawal      0.87       0.84           0.67       0.81    1.18
StigmaR         0.32       0.39           0.41       0.36    0.12
ismi$ISMI29_14
  [1] NA NA  2  2  2  4  2  3  1  2  2  2  2  4  2  2  1  1  1  3  2  3  4  2  4  3  4  2  2  2  2  2  2  2  2
 [36]  1  4  2  3  4  2  3  2  4  3  4  3  2  3  1  3  2  2  3  4  2  4  2  2  2  2  2  2  2  3  1  2  2  4  2
 [71]  4  3  2  1  4  3  3  3  2  4  4  1 NA  2  2  2  3  3  3  4  2  2  3  1  2  2  4  2  4  3  2  1  2  4  4
[106]  2  2  3  2  4  2  1  3  2  4  3  2  4  1  2  3  3  3  2  1  2  2  1  2  3  2  1  3  3  4  2  1  3  2  2
[141]  2  2 NA  4 NA  2  3  2 NA NA  3  1  2  2  2  2  3  1  2  2  2  2  2  3  2  2  4  1  2  3  4 NA  2  2  2
[176]  2  3  2  4  4  2  2  3 NA  2  2  3  3  2  2  1  1  4  2  2  1  3  1  4  3  2  2  2  4  3  2  4 NA  4 NA
[211]  4  3  2  4  2  4  3  3  2  2  1  2  3  1  3  1  1  2  2  3  4  3  1  2  3  1  2  1  4  2  1  4  4  2  4
[246]  4  1  2  2  3  2  4  4  3  2  2  3  4  3  4  2  2  2  4  2  4  4  2  2  1  2  4  3  3  3  4 NA  1  1  1
[281]  3  4  4  1  1  2  4  4  2  2  2 NA  2  2  2  1  2  2  4  1  2  1  3  3  3  2  2  4  2  1  2  3  3  2  1
[316]  3  4  4  3  4  2  4  1  2  2 NA NA  4  1  2  3 NA  1  3  2  3  1  1  3  2  3  3  2  2  2  2  2  1  2  4
[351]  1  2  4  4  3  3  1  1  3  2  1  2  2  1  3  1  1  3  2  3  2 NA NA  2  1  2  2  4  1  4  1  3  2  2  4
[386]  4  2  4  1  1  4  2  1  2  2  1  2  2  4  4  2  2  1  1  3  2  3  4  2 NA  1 NA  2  2  2  4  2  1  2  4
[421]  1  3  2  1  2  3  4  2  2  2  1 NA  2 NA  3  2  2  2  2 NA  1  3  1  2  2  2  2  1  4  2  3 NA  4  1 NA
[456]  1  4  2  4  2  2  2  2  2  4  4  2  2  3  2  3  2  2  3  1  2  1  2  2  3  4  2 NA  1  2 NA  4  4  3  4
[491]  2 NA  4  3  2  2  2  3  1  2  2  2  4  1  2  2  3  4  2 NA NA  1  3  2  2 NA  3  2  4  4 NA  1  1  4  4
[526]  4  4 NA  3  1  1  3  2 NA  2  4  3  3  1 NA  2  2  2  2  4  2  2  1  2  2 NA  2  2 NA NA  1  2  2  2  2
[561]  2  2  2  4 NA  2  2  3  2 NA  3  2  1  4 NA  3  3  1  3  2  2  2  2  2  2  4  2  2  2  2  4  3  2  2  2
[596]  1  2  2  2  3  2  1  2  2  1  3  1  3  2  4  2  1  2  3  2  1 NA  4  4  3  4  4  3  2  3  2  2  2  1  2
[631]  3  4  2  2  2  4  4  3  2  3  4  1  4  2  3  1  2  3  3  2  3  3  2  2  1  1  1  1  3  1  4  2  3  2  1
[666]  1  1  2  4  4  3  2 NA  4  2  1  2  3  2  1  3  4  1  3  4 NA  2  4  2  1  2  3  4  1  4  2  2  4  2  1
[701]  1  2  4  3 NA  1  2  3  1  2  3  2  2 NA  3  2  2  2  2  2  4  3  3  2  2  2  2  4  1  1  2  1  4  2  1
[736]  1 NA  1  3  2  1  3  3  2  2  2  3  2  1  3  2  3  4  2  1  2  1  1  2  2  2  2  2  3  2  2  4  2  4  2
[771]  2 NA NA  2  3  2  2 NA  1  3  4  4  3  4  2 NA  2  2  3  1  1  2 NA  2  1  2  1 NA  1  2  2  2  2  4  4
[806]  2  2  2  2  3  2  3  2  1  2  2  2  2  3  3  3  3  3  1  2  2  1  4  3  2 NA  3  3  4  1  4  2  1  4  2
[841]  1  3 NA  2  1  2  4  2  2  4  3  2  3  2  3  3  4  2  4  2  1  1  1  3  3  3  3  2  2  2  1  1  1  2 NA
[876]  2  1  3  3 NA  1  2  3 NA NA NA  2
cor(ismi$ISMI_Stigmar,ismi$ISMI_Alientation,use="complete.obs")
[1] -0.1243007
ismi %>% select(ISMI_Alientation,ISMI_Stere,ISMI_Discr,ISMI_Withdrawal,ISMI_Stigmar) %>% gather() %>%  ggplot(aes(y=value,x=key,color=value))+geom_boxplot()+geom_jitter()
Warning: Removed 367 rows containing non-finite values (`stat_boxplot()`).
Warning: The following aesthetics were dropped during statistical transformation: colour
ℹ This can happen when ggplot fails to infer the correct grouping structure in the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical variable into a factor?
Warning: Removed 367 rows containing missing values (`geom_point()`).

For some reason, the rescored stigma resistance is a negative correlation

Distress Disclosure Index

Reverse score items 2, 4, 5, 8, 9, 10. Then sum the 12 items. Higher scores indicate a higher tendency to disclose distress, lower scores indicate greater concealment of distress.

ddi<-ddi %>% mutate(across(c(DDI_2,DDI_4,DDI_5,DDI_8,DDI_9,DDI_10),~6-.)) %>%
  rowwise() %>% mutate(DDI_Total=sum(c_across(DDI_1:DDI_12))) %>% 
  ungroup()
Warning in as_tibble.data.frame(data) :
  restarting interrupted promise evaluation
Error in as_tibble.data.frame(data) : 
  cannot open file 'C:/Users/Natas/OneDrive - George Mason University - O365 Production/ResearchStudies/01-MHHS/renv/staging/1/pkgconfig/R/pkgconfig.rdb': No such file or directory

#BFNE

Consists of 12 items, range 1-5 Items 2, 4, 7, and 10 are reverse scored Forward= c(‘BFNE_1’, ‘BFNE_3’, ‘BFNE_5’, ‘BFNE_6’, ‘BFNE_8’, ‘BFNE_9’, ‘BFNE_11’, ‘BFNE_12’), Reverse= c(‘BFNE_2’, ‘BFNE_4’, ‘BFNE_7’, ‘BFNE_10’)

bfne<-mhhs_data %>% select(contains("bfne"))

bfne<-bfne %>% mutate(across(c(BFNE_2,BFNE_4,BFNE_7,BFNE_10),~6-.))
                      
bfne_scoring<-bfne %>% dplyr::select(BFNE_1:BFNE_12)
key_bfne.list<-list(Total=c(1:12))
key_bfne<-make.keys(12,key_bfne.list,colnames(bfne_scoring))

scales_bfne<-scoreItems(key_bfne.list,bfne_scoring)
summary(scales_bfne)

Trust respect scale

8 questions 1-strongly disagree; 7 - strongly agree 2,3,5,6 reverse-scored

trs<-mhhs_data %>% select(contains("trs"))

trs<-trs %>% mutate(across(c(TRS_2,TRS_3,TRS_5,TRS_6),~8-.))

trs_scoring<-trs %>% dplyr::select(TRS_1:TRS_8)
key_trs.list<-list(Total=c(1:8))
key_trs<-make.keys(8,key_trs.list,colnames(trs_scoring))

scales_trs<-scoreItems(key_trs.list,trs_scoring)
summary(scales_trs)
Call: scoreItems(keys = key_trs.list, items = trs_scoring)

Scale intercorrelations corrected for attenuation 
 raw correlations below the diagonal, (unstandardized) alpha on the diagonal 
 corrected correlations above the diagonal:
      Total
Total  0.91
trs %>% select(TRS_1:TRS_8) %>% gather() %>%  ggplot(aes(y=value,x=key,color=value))+geom_boxplot()+geom_jitter()
Warning: Removed 390 rows containing non-finite values (`stat_boxplot()`).
Warning: The following aesthetics were dropped during statistical transformation: colour
ℹ This can happen when ggplot fails to infer the correct grouping structure in the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical variable into a factor?
Warning: Removed 390 rows containing missing values (`geom_point()`).

Trust in Physician Scale

1 (strongly disagree)- 5 (strongly agree) 11 items, unweighted mean of response reverse scored - 1, 5, 7, 11 original scale alpha = .90

Summary score of medical skepticism was obtained by taking the unweighted mean of the four items.


tps<-mhhs_data %>% select(contains("tps"))

tps<-tps %>% mutate(across(c(TPS_1,TPS_5,TPS_7,TPS_11),~6-.)) %>% 
  rowwise() %>% mutate(TPS_Tot=sum(c_across(TPS_1:TPS_11))) %>% 
  ungroup()

#selecting the write-ins
tps %>% filter(TPS_O!="") %>% select(TPS_O)

tps_scoring<-tps %>% dplyr::select(TPS_1:TPS_11)
key_tps.list<-list(Total=c(1:11))
key_tps<-make.keys(11,key_tps.list,colnames(tps_scoring))

scales_tps<-scoreItems(key_tps.list,tps_scoring)
summary(scales_tps)
Call: scoreItems(keys = key_tps.list, items = tps_scoring)

Scale intercorrelations corrected for attenuation 
 raw correlations below the diagonal, (unstandardized) alpha on the diagonal 
 corrected correlations above the diagonal:
      Total
Total  0.89
tps %>% select(TPS_1:TPS_11) %>% gather() %>%  ggplot(aes(y=value,x=key,color=value))+geom_boxplot()+geom_jitter()
Warning: Removed 705 rows containing non-finite values (`stat_boxplot()`).
Warning: The following aesthetics were dropped during statistical transformation: colour
ℹ This can happen when ggplot fails to infer the correct grouping structure in the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical variable into a factor?
Warning: Removed 705 rows containing missing values (`geom_point()`).

Ethnic Identity Scale

reverse score 4,5,8

eis<-mhhs_data %>% select(contains("eis"))

# identity questions
eis_id<-eis %>% select(EIS_RE1:EIS_HORIGIN_3_TEXT)
eis_resp<-eis %>% select(!EIS_RE1:EIS_HORIGIN_3_TEXT)

# observe the write-ins
eis_id %>% filter(EIS_RE1_7_TEXT!="") %>% select(EIS_RE1_7_TEXT)
eis_id %>% filter(EIS_HORIGIN_3_TEXT!="") %>% select(EIS_HORIGIN_3_TEXT)

# selecting responses only
eis_resp<-eis_resp %>% mutate(across(c(EIS_Ethni_4,EIS_Ethni_5,EIS_Ethni_8),~5-.)) %>% 
  rowwise() %>% mutate(EIS_Tot=sum(c_across(EIS_Ethni_1:EIS_Ethni_9))) %>% 
  ungroup()

eis_scoring<-eis_resp %>% dplyr::select(EIS_Ethni_1:EIS_Ethni_9)
key_eis.list<-list(Total=c(1:9))
key_eis<-make.keys(9,key_eis.list,colnames(eis_scoring))

scales_eis<-scoreItems(key_eis.list,eis_scoring)
summary(scales_eis)
Call: scoreItems(keys = key_eis.list, items = eis_scoring)

Scale intercorrelations corrected for attenuation 
 raw correlations below the diagonal, (unstandardized) alpha on the diagonal 
 corrected correlations above the diagonal:
      Total
Total  0.82
eis_resp %>% select(EIS_Ethni_1:EIS_Ethni_9) %>% gather() %>%  ggplot(aes(y=value,x=key,color=value))+geom_boxplot()+geom_jitter()
Warning: Removed 547 rows containing non-finite values (`stat_boxplot()`).
Warning: The following aesthetics were dropped during statistical transformation: colour
ℹ This can happen when ggplot fails to infer the correct grouping structure in the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical variable into a factor?
Warning: Removed 547 rows containing missing values (`geom_point()`).

Everyday Iniquity - Content

bicf<-mhhs_data %>% select(contains("bicf"))

10 items 1=sd 5 =sa

The numbering is a little odd on the original scale. There’s only 10 items numbered to 14. 7 = 5 8 = 6 11 = 7 12 = 8 13 = 9 14 = 10 reverse score 7, 8, 11, 12, 13, 14 only for total subscale mean Harmony: 1, 2, 3, 6 Higher scores mean higher harmony (affective) Conflict: 7, 8, 11, 12, 13, 14 Items 2 and 8 are only asked for participants who self-identified as bicultural.

summary(scales_BICII)
Call: scoreItems(keys = key_BICII.list, items = BICII_scoring)

Scale intercorrelations corrected for attenuation 
 raw correlations below the diagonal, (unstandardized) alpha on the diagonal 
 corrected correlations above the diagonal:
      Total
Total  0.89

Tosca-3

Relationship assessment scale

Self-concealment

MINI-IPIP

Combining scales for projects

kayleighdata<-cbind(mhhs_data$ResponseId,demographics,bicii,eis,ghsql,ismi,trs,tps)
Error in cbind(mhhs_data$ResponseId, demographics, bicii, eis, ghsql,  : 
  object 'demographics' not found
LS0tDQp0aXRsZTogIk1ISFMgU2NvcmluZyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIGxvYWQgbGlicmFyaWVzfQ0KbGlicmFyeShwc3ljaCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShhcGFUYWJsZXMpDQpsaWJyYXJ5KHRhYmxlb25lKQ0KbGlicmFyeShkcGx5cikNCg0KYGBgDQoNCmBgYHtyIGNsZWFuIHF1YWx0cmljcyBoZWFkaW5nc30NCiMgTm90ZSB0aGF0IHRoZXJlJ3MgYSBwYWNrYWdlIHRoYXQgZG9lcyB0aGlzIHNtb290aGx5LiBOZWVkIHRvIGFkZCBpdCBhcyBhbiBhbHRlcm5hdGl2ZSBhdCBzb21lIHBvaW50DQoNCiNjb2x1bW5OYW1lczwtcmVhZC5jc3YoIi4uLzAxLVJhd0RhdGEvTUhIUy0xXzEyMjAyMDIzLmNzdiIsaGVhZGVyPUZBTFNFKVsxLF0NCg0KI3F1YWxfZGF0YTwtcmVhZC5jc3YoIi4uLzAxLVJhd0RhdGEvTUhIUy0xXzEyMjAyMDIzLmNzdiIsaGVhZGVyPUZBTFNFLGNvbC5uYW1lcyA9IGNvbHVtbk5hbWVzKVstYygxOjMpLF0NCg0KIyB3cml0ZSBhIG5ldyB2ZXJzaW9uIHRoYXQgY2FuIGJlIHJlaW1wb3J0ZWQgd2l0aCB0aGUgcHJvcGVyIGNvbHVtbiBjbGFzc2VzDQojd3JpdGUuY3N2KHF1YWxfZGF0YSwiLi4vMDQtUHJvY2Vzc2VkRGF0YS9NSEhTLTFfMTIyMDIwMjNfY2xlYW5oZWFkZXIuY3N2Iixyb3cubmFtZXM9RkFMU0UpDQpgYGANCg0KYGBge3IgbG9hZCBkYXRhfQ0KDQptaGhzX2RhdGE8LXJlYWQuY3N2KCIuLi8wNC1Qcm9jZXNzZWREYXRhL01ISFMtMV8xMjIwMjAyM19jbGVhbmhlYWRlci5jc3YiKQ0KDQpgYGANCg0KYGBge3IgbWV0YWRhdGF9DQojIHNhdmluZyB0aGUgc3RhcnQsIGVuZCwgcHJvZ3Jlc3MsIGR1cmF0aW9uIGV0Yy4NCm1ldGFfZGF0YTwtbWhoc19kYXRhICU+JSBzZWxlY3QoU3RhcnREYXRlOlJlc3BvbnNlSWQsIGNvbnRhaW5zKCJDb25zZW50Iiksc3RhcnRzX3dpdGgoIkFDIikpICU+JSBtdXRhdGUoRHVyYXRpb25faW5fc2Vjb25kcz1EdXJhdGlvbi4uaW4uc2Vjb25kcy4pDQoNCiNzYXZlKG1ldGFfZGF0YSxmaWxlPSIuLi8wNC1Qcm9jZXNzZWREYXRhL21ldGFfZGF0YS5SRFMiKQ0KDQpgYGANCg0KYGBge3IgZGVtb2dyYXBoaWNzfQ0KDQojIEtub3cgdGhlIHJhbmdlIG9mIHBvc3NpYmxlIGFuc3dlcnMgZm9yIGVhY2ggZmFjdG9yIGFuZCBtYWtlIHN1cmUgdG8gaW5jbHVkZSBOQQ0KDQptaGhzX2RlbW90Ymw8LW1oaHNfZGF0YSAlPiUgc2VsZWN0KFJhY2VfRXRobjIsQklDXzEsTEFOR18xLEVEVUNfUGFyLEVEVUNfU2VsZixHRU5ERVIsU0VYT1IsTUlMSVQsSU5DT01FKSAlPiUgDQptdXRhdGUoDQpSYWNlX0V0aG4yPWZhY3RvcihSYWNlX0V0aG4yLGxldmVscz1jKE5BLDEsMiwzLDQsNSw2LDcpLGxhYmVscz1jKCJOb3QgYW5zd2VyZWQiLCJXaGl0ZSIsIkJsYWNrIiwiSGlzcGFuaWMiLCJBc2lhbiIsIkFtZXJJbmRpYW4iLCJQYWNpZmljSXNsYW5kZXIiLCJNdWx0aXJhY2lhbCIpLGV4Y2x1ZGU9TlVMTCksIA0KQklDXzE9ZmFjdG9yKEJJQ18xLCBsZXZlbHM9YyhOQSwwLDEpLGxhYmVscz1jKCJOb3QgYW5zd2VyZWQiLCJOb3RCaWN1bHR1cmFsIiwiQmljdWx0dXJhbCIpLGV4Y2x1ZGU9TlVMTCksIA0KTEFOR18xPWZhY3RvcihMQU5HXzEsIGxldmVscz1jKE5BLDAsMSksbGFiZWxzPWMoIk5vdCBBbnN3ZXJlZCIsIkVuZ2xpc2ggYXQgSG9tZSIsIkFkZGl0aW9uYWwgTGFuZ3VhZ2UgYXQgSG9tZSIpLGV4Y2x1ZGU9TlVMTCksIA0KRURVQ19QYXI9ZmFjdG9yKEVEVUNfUGFyLGxldmVscz1jKE5BLDEsMiwzLDQsNSw2LDcpLGxhYmVscyA9IGMoIk5vdCBhbnN3ZXJlZCIsIjxIaWdoIFNjaG9vbCIsIkhpZ2ggU2Nob29sIiwiU29tZSBjb2xsZWdlIiwiQXNzb2NpYXRlcyIsIkJhY2hlbG9ycyIsIk1hc3RlcnMiLCJEb2N0b3JhbC9Qcm9mZXNzaW9uYWwiKSxleGNsdWRlID0gTlVMTCksDQpFRFVDX1NlbGY9ZmFjdG9yKEVEVUNfU2VsZixsZXZlbHM9YyhOQSwxLDIsMyw0LDUsNiw3KSxsYWJlbHMgPSBjKCJOb3QgYW5zd2VyZWQiLCI8SGlnaCBTY2hvb2wiLCJIaWdoIFNjaG9vbCIsIlNvbWUgY29sbGVnZSIsIkFzc29jaWF0ZXMiLCJCYWNoZWxvcnMiLCJNYXN0ZXJzIiwiRG9jdG9yYWwvUHJvZmVzc2lvbmFsIiksZXhjbHVkZT1OVUxMKSwgDQpHRU5ERVI9ZmFjdG9yKEdFTkRFUixsZXZlbHM9YyhOQSwxLDIsMyw0LDUsNiw3KSxsYWJlbHM9YygiTm90IGFuc3dlcmVkIiwiY2lzLXdvbWFuIiwiY2lzLW1hbiIsInRyYW5zIHdvbWFuIiwidHJhbnMgbWFuIiwibm9uLWJpbmFyeSIsInNlbGYtaWQiLCJwcmVmZXIgbm90IHRvIHJlc3BvbmQiKSxleGNsdWRlPU5VTEwpLCANClNleHVhbE9yaWVudGF0aW9uPWZhY3RvcihTRVhPUiwgbGV2ZWxzPWMoTkEsMSwyLDMsNCw1LDYsNyw4KSwgbGFiZWxzID0gYygiTm90IEFuc3dlcmVkIiwiU3RyYWlnaHQiLCJCaXNleHVhbCIsIkdheSIsIkxlc2JpYW4iLCJRdWVlciIsIlF1ZXN0aW9uaW5nIiwiU2VsZi1JRCIsIlByZWZlciBub3QgdG8gcmVzcG9uZCIpLGV4Y2x1ZGUgPSBOVUxMKSwgDQpNaWxpdGFyeVNlcnZpY2U9ZmFjdG9yKE1JTElULGxldmVscz1jKE5BLDEsMiwzLDQsNSw2LDcsOCksbGFiZWxzPWMoIk5vdCBhbnN3ZXJlZCIsIk5ldmVyIFNlcnZlZCIsIkFjdGl2ZSBEdXR5IiwiTmF0aW9uYWwgR3VhcmQiLCJNaWxpdGFyeSBTcG91c2UiLCJNaWxpdGFyeSBEZXBlbmRlbnQiLCJWZXRlcmFuIiwiT3RoZXIiLCJQcmVmZXIgbm90IHRvIHJlc3BvbmQiKSxleGNsdWRlPU5VTEwpLA0KICBJbmNvbWU9ZmFjdG9yKElOQ09NRSxsZXZlbHM9YyhOQSwxLDIsMyw0LDUsNiksbGFiZWxzPWMoIk5vdCBhbnN3ZXJlZCIsIkxlc3MgdGhhbiAxMGsiLCIxMCwwMDAtMjAsMDAwIiwiMjAsMDAwLTUwLDAwMCIsIjUwLDAwMC0xMDAsMDAwIiwiMTAwLDAwMC0xNTAsMDAwIiwiMTUwLDAwMCsiKSxleGNsdWRlID0gTlVMTCkpICU+JSANCnNlbGVjdCgtTUlMSVQsLVNFWE9SKQ0KDQpDcmVhdGVUYWJsZU9uZShkYXRhPW1oaHNfZGVtb3RibCkNCg0KI3NhdmUobWhoc19kZW1vdGJsLGZpbGU9Ii4uLzA0LVByb2Nlc3NlZERhdGEvRGVtb3RhYmxlLlJEUyIpDQpgYGANCg0KIyBQUk9NSVNfR2xvYmFsIHYxLjINClRvIHNjb3JlIHRoZSBQUk9NSVNfR2xvYmFsOg0KRmlyc3QgY2hlY2sgaWYgc3VydmV5IGNvZGVkIEV4Y2VsbGVudCBhcyAxIG9yIGFzIDUuIFF1YWx0cmljcyB3aWxsIG9mdGVuIHJldmVyc2UgdGhlbS4gSGlnaGVyIHNjb3JlcyBzaG91bGQgcmVmbGVjdCBiZXR0ZXIgZnVuY3Rpb25pbmcuDQoNClBST01JU19HbG9iYWwxXzE6UFJPTUlTX0dsb2JhbDFfNzogSXRlbXMgcmF0ZWQgZnJvbSA1IChleGNlbGxlbnQpIHRvIDEgKE5vdCBhdCBhbGwpIG9uIG9yaWdpbmFsIHNjYWxlOw0KUFJPTUlTX0dsb2JhbDFfMTpQUk9NSVNfR2xvYmFsMV83IGFyZSByZXZlcnNlZCBmcm9tIFF1YWx0cmljcyAxLTUgZGVmYXVsdHMNCg0KUFJPTUlTX0dsb2JhbDJfMTogZW1vdGlvbmFsIHByb2JsZW1zOyBwYXN0IDcgZGF5czsgNSAobmV2ZXIpIHRvIDEgKGFsd2F5cyk7IChnbG9iYWwgMTApDQpQUk9NSVNfR2xvYmFsMl8yOiBmYXRpZ3VlOyBwYXN0IDcgZGF5cyAoZ2xvYmFsIDA4KQ0KDQpQUk9NSVNfR2xvYmFsM18xOiBwYWluLiA1PTAsIDQ9MTozLCAzPTQ6NiwgMj03OjksIDE9MTANCg0KRm9yIHNjb3JpbmcsICAiMiBxdWVzdGlvbnMgd2VyZSBleGNsdWRlZCBmcm9tIHRoZSBjYWxjdWxhdGlvbi9ldmFsdWF0aW9uIGFzIGEgcmVzdWx0IG9mIHRoZSBxdWVzdGlvbm5haXJlIGRldmVsb3BtZW50IHN0dWR5OiBHbG9iYWwwMSBiZWNhdXNlIG9mIGl0cyBzdGF0aXN0aWNhbCBjb25ncnVlbmNlIHdpdGggR2xvYmFsMDMuIEdsb2JhbDA5ciBiZWNhdXNlIG9mIGl0cyBhcHByb3hpbWF0ZWx5IGVxdWFsIHN0YXRpc3RpY2FsIGNvcnJlbGF0aW9uIHRvIHBoeXNpY2FsIGFuZCBtZW50YWwgaGVhbHRoLiINCg0KVGhlIEdsb2JhbCBQaHlzaWNhbCBIZWFsdGggc2NvcmUgaXMgZ2VuZXJhdGVkIGJ5IHN1bW1pbmcgcmVzcG9uc2VzIHRvDQpHbG9iYWwwMyAoUFJPTUlTX0dsb2JhbDFfMyksIEdsb2JhbDA2IChQUk9NSVNfR2xvYmFsMV83KSwgR2xvYmFsMDdyZXNjb3JlZCAoUFJPTUlTX0dsb2JhbDNfMSksIGFuZCBHbG9iYWwwOHJlc2NvcmVkIChQUk9NSVNfR2xvYmFsMl8yKS4gVGhlIEdsb2JhbCBNZW50YWwgSGVhbHRoIHNjb3JlDQppcyBnZW5lcmF0ZWQgYnkgc3VtbWluZyByZXNwb25zZXMgdG8gR2xvYmFsMDIgKFBST01JU19HbG9iYWwxXzIpLCBHbG9iYWwwNCAoUFJPTUlTX0dsb2JhbDFfNCksIEdsb2JhbDA1KFBST01JU19HbG9iYWwxXzUpLCBhbmQgR2xvYmFsMTByZXNjb3JlZCAoUFJPTUlTX0dsb2JhbDJfMSkNCg0KYGBge3IgUFJPTUlTfQ0KcHJvbWlzX2dsb2JhbDwtbWhoc19kYXRhICU+JSBzZWxlY3QoY29udGFpbnMoIlBST01JUyIpKQ0KDQojc2NvcmUgaXRlbXMgc28gdGhhdCBoaWdoZXIgc2NvcmVzIHJlZmxlY3QgYmV0dGVyIGZ1bmN0aW9uaW5nIA0KDQojIHBhaW4gaXRlbTogNT0wLCA0PTE6MywgMz00OjYsIDI9Nzo5LCAxPTEwDQoNCiMgcmVuYW1pbmcgdGhlIFByb21pcyB0byBtYXRjaCB0aGUgb3JpZ2luYWwgbWVhc3VyZQ0KDQpwcm9taXNfZ2xvYmFsPC1wcm9taXNfZ2xvYmFsICU+JSByZW5hbWVfd2l0aCh+c3ByaW50ZigiUFJPTUlTX0dsb2JhbDAlZCIsMTo1KSwuY29scz1jKFBST01JU19HbG9iYWwxXzE6UFJPTUlTX0dsb2JhbDFfNSkpICU+JSAgcmVuYW1lKFBST01JU19HbG9iYWwwOT1QUk9NSVNfR2xvYmFsMV82LFBST01JU19HbG9iYWwwNj1QUk9NSVNfR2xvYmFsMV83LCBQUk9NSVNfR2xvYmFsMTA9UFJPTUlTX0dsb2JhbDJfMSwgUFJPTUlTX0dsb2JhbDA4PVBST01JU19HbG9iYWwyXzIsUFJPTUlTX0dsb2JhbDA3PVBST01JU19HbG9iYWwzXzEpJT4lIG11dGF0ZShhY3Jvc3MoYyhQUk9NSVNfR2xvYmFsMDE6UFJPTUlTX0dsb2JhbDA4KSx+Ni0uKSkgJT4lIA0KICBtdXRhdGUoUFJPTUlTX0dsb2JhbDA3PXJlY29kZShQUk9NSVNfR2xvYmFsMDcsYDBgPTUsYDFgPTQsYDJgPTQsYDNgPTQsYDRgPTMsYDVgPTMsYDZgPTMsYDdgPTIsYDhgPTIsYDlgPTIsYDEwYD0xKSklPiUgDQogIHJvd3dpc2UoKSAlPiUgIG11dGF0ZShQR19QaHlzSGVhbHRoPXN1bShjKFBST01JU19HbG9iYWwwMyxQUk9NSVNfR2xvYmFsMDYsUFJPTUlTX0dsb2JhbDA3LFBST01JU19HbG9iYWwwOCkpLFBHX01lbnRIZWFsdGg9c3VtKGMoUFJPTUlTX0dsb2JhbDAyLFBST01JU19HbG9iYWwwNCxQUk9NSVNfR2xvYmFsMDUsUFJPTUlTX0dsb2JhbDEwKSkpICU+JSB1bmdyb3VwKCkNCg0KcHJvbWlzX2dsb2JhbF9zY29yaW5nPC1wcm9taXNfZ2xvYmFsICU+JSBzZWxlY3QoLVBST01JU19HbG9iYWwwMSwgLVBST01JU19HbG9iYWwwOSwtUEdfUGh5c0hlYWx0aCwtUEdfTWVudEhlYWx0aCkNCg0Ka2V5X3Byb21pcy5saXN0PC1saXN0KFBIPWMoIlBST01JU19HbG9iYWwwMyIsIlBST01JU19HbG9iYWwwNiIsIlBST01JU19HbG9iYWwwNyIsIlBST01JU19HbG9iYWwwOCIpLE1IPWMoIlBST01JU19HbG9iYWwwMiIsIlBST01JU19HbG9iYWwwNCIsIlBST01JU19HbG9iYWwwNSIsIlBST01JU19HbG9iYWwxMCIpKQ0KDQprZXlfcHJvbWlzPC1tYWtlLmtleXMobnZhcnM9OCxrZXlfcHJvbWlzLmxpc3QsaXRlbS5sYWJlbHMgPSBjb2xuYW1lcyhwcm9taXNfZ2xvYmFsX3Njb3JpbmcpKQ0Kc2NhbGVzX3Byb21pczwtc2NvcmVJdGVtcyhrZXlfcHJvbWlzLHByb21pc19nbG9iYWxfc2NvcmluZykNCnN1bW1hcnkoc2NhbGVzX3Byb21pcykNCg0KYGBgDQoNCiMgR0hTUUwNCkdIU1FMIGhhcyBvbmUgb3Blbi1yZXNwb25zZSBpdGVtLiBUaGlzIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgc3VtbWFyeSBzY29yZS4gU2NvcmluZyBhbHNvIHNlZW1zIHNvbWV3aGF0IGZsZXhpYmxlIGFuZCBpbmNsdWRlcyBpbmZvcm1hbC9mb3JtYWw7IHBlcnNvbmFsLWVtb3Rpb25hbC9zdWljaWRlOyBoZWxwIGZyb20gYW55b25lL0hlbHAgZnJvbSBuby1vbmUuDQoNClJhbmdlIDEtNyAoRXh0cmVtZWx5IHVubGlrZWx5IHRvIEV4dHJlbWVseSBMaWtlbHkpDQoNCmBgYHtyIEdIU1FMfQ0KZ2hzcWw8LW1oaHNfZGF0YSAlPiUgc2VsZWN0KGNvbnRhaW5zKCJHSFNRTCIpKQ0KDQpnaHNxbDwtZ2hzcWwgJT4lIG11dGF0ZShHZW5lcmFsPXJvd1N1bXMoKHNlbGVjdChnaHNxbCxHSFNRTF9QZXJzXzE6R0hTUUxfUGVyc185LEdIU1FMX1NVSV8xOkdIU1FMX1NVSV85KSkpKSAlPiUgDQogcm93d2lzZSgpICU+JSAgDQogIG11dGF0ZShQZXJzb25hbD1zdW0oY19hY3Jvc3MoR0hTUUxfUGVyc18xOkdIU1FMX1BlcnNfOCkpLA0KICAgICAgICAgU3VpY2lkZT1zdW0oY19hY3Jvc3MoR0hTUUxfU1VJXzE6R0hTUUxfU1VJXzgpKSwNCiAgICAgICAgIEluZm9ybWFsX2FsbD1zdW0oYyhHSFNRTF9QZXJzXzEsR0hTUUxfU1VJXzEsR0hTUUxfUGVyc18yLEdIU1FMX1NVSV8yLEdIU1FMX1BlcnNfMyxHSFNRTF9TVUlfMyxHSFNRTF9QZXJzXzQsR0hTUUxfU1VJXzQpKSwNCiAgICAgICAgIEZvcm1hbF9hbGw9c3VtKGMoR0hTUUxfUGVyc181LEdIU1FMX1NVSV81LEdIU1FMX1BlcnNfNixHSFNRTF9TVUlfNixHSFNRTF9QZXJzXzcsR0hTUUxfU1VJXzcsR0hTUUxfUGVyc184LEdIU1FMX1NVSV84KSksDQogICAgICAgICBOb25lX2FsbD1zdW0oYyhHSFNRTF9QZXJzXzksR0hTUUxfU1VJXzkpKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lICNyZW1vdmUgcm93d2lzZSBncm91cGluZyANCiAgbXV0YXRlKFBlcnNvbmFsX3o9c2NhbGUoUGVyc29uYWwpLFN1aWNpZGVfej1zY2FsZShTdWljaWRlKSxJbmZvcm1hbF9hbGxfej1zY2FsZShJbmZvcm1hbF9hbGwpLEZvcm1hbF9hbGxfej1zY2FsZShGb3JtYWxfYWxsKSxOb25lX2FsbF96PXNjYWxlKE5vbmVfYWxsKSkNCg0KI21ha2UgYSBkYXRhZnJhbWUgd2l0aCBvbmx5IHRoZSBpdGVtcyB0byBiZSBzY29yZWQvdGhhdCBuZWVkIHJlbGlhYmlsaXR5DQpnaHNxbF9zY29yaW5nPC1naHNxbCAlPiUgZHBseXI6OnNlbGVjdCgxOjksMTI6MjApDQprZXlfZ2hzcWwubGlzdDwtbGlzdChHZW5lcmFsPWMoMToxOCksUGVyc29uYWw9YygxOjkpLFN1aWNpZGU9YygxMDoxOCksRm9ybWFsPWMoNSwxNCw2LDE1LDcsMTYsOCwxNyksSW5mb3JtYWw9YygxLDEwLDIsMTEsMywxMiw0LDEzKSkNCmtleV9naHNxbDwtbWFrZS5rZXlzKDE4LGtleV9naHNxbC5saXN0LGNvbG5hbWVzKGdoc3FsX3Njb3JpbmcpKQ0KDQpzY2FsZXNfZ2hzcWw8LXNjb3JlSXRlbXMoa2V5X2doc3FsLmxpc3QsZ2hzcWxfc2NvcmluZykNCnN1bW1hcnkoc2NhbGVzX2doc3FsKQ0KDQojaGlzdG9ncmFtIHRvIGV4cGxvcmUgdGhlIHJhbmdlIA0KZ2hzcWwgJT4lIHNlbGVjdChHSFNRTF9QZXJzXzE6R0hTUUxfUGVyc185KSAlPiUgZ2F0aGVyKCkgJT4lIGdncGxvdChhZXMoeT12YWx1ZSx4PWtleSkpICsgZ2VvbV9ib3hwbG90KCkgKyBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJJbnRpbWF0ZSBwYXJ0bmVyIiwgIkZyaWVuZCIsIlBhcmVudCIsIk90aGVyIHJlbGF0aXZlIiwiTUhQIiwiUGhvbmUgaGVscGxpbmUiLCJEb2N0b3IiLCJNaW5pc3RlciIsIk5vdCBzZWVrIGhlbHAiKSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkNCg0KZ2hzcWwgJT4lIHNlbGVjdChHSFNRTF9TVUlfMTpHSFNRTF9TVUlfOSkgJT4lIGdhdGhlcigpICU+JSBnZ3Bsb3QoYWVzKHk9dmFsdWUseD1rZXkpKSArIGdlb21fYm94cGxvdCgpICsgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiSW50aW1hdGUgcGFydG5lciIsICJGcmllbmQiLCJQYXJlbnQiLCJPdGhlciByZWxhdGl2ZSIsIk1IUCIsIlBob25lIGhlbHBsaW5lIiwiRG9jdG9yIiwiTWluaXN0ZXIiLCJOb3Qgc2VlayBoZWxwIikpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpDQoNCmdoc3FsICU+JSBzZWxlY3QoSW5mb3JtYWxfYWxsX3osRm9ybWFsX2FsbF96LE5vbmVfYWxsX3opICU+JSBnYXRoZXIoKSAlPiUgZ2dwbG90KGFlcyh5PXZhbHVlLHg9a2V5KSkgKyBnZW9tX2JveHBsb3QoKSArIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkluZm9ybWFsIChQZXJzICsgU3VpKSIsIkZvcm1hbCAoUGVycyArIFN1aSkiLCJOb25lIChQZXJzICsgU3VpKSIpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTApKQ0KDQpnaHNxbCAlPiUgc2VsZWN0KEdIU1FMX1BlcnNfMTBfVEVYVCxHSFNRTF9TVUlfMTBfVEVYVCkgJT4lIGZpbHRlcihHSFNRTF9QZXJzXzEwX1RFWFQhPSIifEdIU1FMX1NVSV8xMF9URVhUIT0iIikNCg0KYGBgDQoNCiMgREFTUzIxDQoNClN0cmVzcyBpdGVtcyBhcmUgMSwgNiwgOCwgMTEsIDEyLCAxNCwgMTgNCkFueGlldHkgaXRlbXMgYXJlIDIsIDQsIDcsIDksIDE1LCAxOSwgMjAsICANCkRlcHJlc3Npb24gaXRlbXMgYXJlIDMsIDUsIDEwLCAxMywgMTYsIDE3LCAyMSANCg0KVGhlIGRlcHJlc3Npb24gc2NhbGUgYXNzZXNzZXMgZHlzcGhvcmlhLCBob3BlbGVzc25lc3MsIGRldmFsdWF0aW9uIG9mIGxpZmUsIHNlbGYtZGVwcmVjYXRpb24sIGxhY2sgb2YgaW50ZXJlc3QgLyBpbnZvbHZlbWVudCwgYW5oZWRvbmlhIGFuZCBpbmVydGlhLiANCg0KVGhlIGFueGlldHkgc2NhbGUgYXNzZXNzZXMgYXV0b25vbWljIGFyb3VzYWwsIHNrZWxldGFsIG11c2NsZSBlZmZlY3RzLCBzaXR1YXRpb25hbCBhbnhpZXR5LCBhbmQgc3ViamVjdGl2ZSBleHBlcmllbmNlIG9mIGFueGlvdXMgYWZmZWN0LiANClRoZSBzdHJlc3Mgc2NhbGUgaXMgc2Vuc2l0aXZlIHRvIGxldmVscyBvZiBjaHJvbmljIG5vbnNwZWNpZmljIGFyb3VzYWwuIEl0IGFzc2Vzc2VzIGRpZmZpY3VsdHkgcmVsYXhpbmcsIG5lcnZvdXMgYXJvdXNhbCwgYW5kIGJlaW5nIGVhc2lseSB1cHNldCAvIGFnaXRhdGVkLCBpcnJpdGFibGUgLyBvdmVyLXJlYWN0aXZlIGFuZCBpbXBhdGllbnQuIA0KDQpTY29yZXMgZm9yIGRlcHJlc3Npb24sIGFueGlldHkgYW5kIHN0cmVzcyBhcmUgY2FsY3VsYXRlZCBieSBzdW1taW5nIHRoZSBzY29yZXMgZm9yIHRoZSByZWxldmFudCBpdGVtcw0KDQpTY29yZXMgb24gdGhlIERBU1MtMjEgd2lsbCBuZWVkIHRvIGJlIG11bHRpcGxpZWQgYnkgMiB0byBjYWxjdWxhdGUgdGhlIGZpbmFsIHNjb3JlIGFuZCBzdGF5IGVxdWl2YWxlbnQgd2l0aCBEQVNTLTQyLg0KYGBge3IgREFTUzIxfQ0KZGFzczwtbWhoc19kYXRhICU+JSBzZWxlY3QoY29udGFpbnMoIkRBU1MiKSkNCg0KZGFzczwtZGFzcyAlPiUgbXV0YXRlKERhc3MyMV9Ub3RhbD1yb3dTdW1zKChzZWxlY3QoZGFzcyxEQVNTMjFfMTpEQVNTMjFfMjEpKSkqMikgJT4lIA0KIHJvd3dpc2UoKSAlPiUgIA0KICBtdXRhdGUoRGFzczIxX1N0cmVzcz1zdW0oREFTUzIxXzEsREFTUzIxXzYsIERBU1MyMV84LERBU1MyMV8xMSxEQVNTMjFfMTIsREFTUzIxXzE0LERBU1MyMV8xOCxuYS5ybSA9IFQpLA0KICAgICAgICAgRGFzczIxX0FueGlldHk9c3VtKERBU1MyMV8yLERBU1MyMV80LERBU1MyMV83LERBU1MyMV85LERBU1MyMV8xNSxEQVNTMjFfMTksREFTUzIxXzIwLCBuYS5ybT1UKSwNCiAgICAgICAgIERhc3MyMV9EZXByZXNzaW9uPXN1bShEQVNTMjFfMyxEQVNTMjFfNSxEQVNTMjFfMTAsREFTUzIxXzEzLERBU1MyMV8xNixEQVNTMjFfMTcsREFTUzIxXzIxLCBuYS5ybT1UKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lDQogIG11dGF0ZShEYXNzMjFfU3RyZXNzX3o9c2NhbGUoLiwpKSAlPiUNCiAgbXV0YXRlKERlcF9jdXRzPWNhc2Vfd2hlbihEYXNzMjFfRGVwcmVzc2lvbjwxMH4iTm9ybWFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX0RlcHJlc3Npb248MTR+Ik1pbGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXNzMjFfRGVwcmVzc2lvbjwyMX4iTW9kZXJhdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXNzMjFfRGVwcmVzc2lvbjwyOH4iU2V2ZXJlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX0RlcHJlc3Npb24+Mjd+IkV4dHJlbWVseV9TZXZlcmUiKSwNCiAgICAgICAgICAgICAgICBBbnhfY3V0cz1jYXNlX3doZW4oRGFzczIxX0FueGlldHk8OH4iTm9ybWFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX0FueGlldHk8MTB+Ik1pbGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXNzMjFfQW54aWV0eTwxNX4iTW9kZXJhdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXNzMjFfQW54aWV0eTwyMH4iU2V2ZXJlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX0FueGlldHk+MTl+IkV4dHJlbWVseV9TZXZlcmUiKSwNCiAgICAgICAgICAgICAgICBTdHJlc3NfY3V0cz1jYXNlX3doZW4oRGFzczIxX1N0cmVzczwxNX4iTm9ybWFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX1N0cmVzczwxOX4iTWlsZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhc3MyMV9TdHJlc3M8MjZ+Ik1vZGVyYXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX1N0cmVzczwzNH4iU2V2ZXJlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX1N0cmVzcz4zM34iRXh0cmVtZWx5X1NldmVyZSIpKQ0KDQoNCiNtYWtlIGEgZGF0YWZyYW1lIHdpdGggb25seSB0aGUgaXRlbXMgdG8gYmUgc2NvcmVkL3RoYXQgbmVlZCByZWxpYWJpbGl0eQ0KZGFzc19zY29yaW5nPC1kYXNzICU+JSBkcGx5cjo6c2VsZWN0KERBU1MyMV8xOkRBU1MyMV8yMSkNCmtleV9kYXNzLmxpc3Q8LWxpc3QoU3RyZXNzPWMoMSw2LDgsMTEsMTIsMTQsMTgpLEFueGlldHk9YygyLDQsNyw5LDE1LDE5LDIwKSxEZXByZXNzaW9uPWMoMyw1LDEwLDEzLDE2LDE3LDIxKSkNCg0Ka2V5X2Rhc3M8LW1ha2Uua2V5cygyMSxrZXlfZGFzcy5saXN0LGNvbG5hbWVzKGRhc3Nfc2NvcmluZykpDQoNCnNjYWxlc19kYXNzPC1zY29yZUl0ZW1zKGtleV9kYXNzLmxpc3QsZGFzc19zY29yaW5nKQ0Kc3VtbWFyeShzY2FsZXNfZGFzcykNCg0KI2hpc3RvZ3JhbSB0byBleHBsb3JlIHRoZSByYW5nZSANCmRhc3MgJT4lIHNlbGVjdChEYXNzMjFfU3RyZXNzLERhc3MyMV9BbnhpZXR5LCBEYXNzMjFfRGVwcmVzc2lvbikgJT4lIGdhdGhlcigpICU+JSBnZ3Bsb3QoYWVzKHk9dmFsdWUseD1rZXkpKSArIGdlb21fYm94cGxvdCgpICsgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiU3RyZXNzIiwiQW54aWV0eSIsIkRlcHJlc3Npb24iKSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkNCg0KI3NjYXR0ZXJwbG90IHRvIGNvbG9yIHRoZSBjdXRvZmZzDQpkYXNzX3NldmVyaXR5PC1kYXNzICU+JSAgc2VsZWN0KERhc3MyMV9TdHJlc3MsRGFzczIxX0FueGlldHksIERhc3MyMV9EZXByZXNzaW9uKSAlPiUgDQpwaXZvdF9sb25nZXIoY29scz1zdGFydHNfd2l0aCgiRGFzczIxIiksbmFtZXNfdG8gPSAiU3Vic2NhbGUiLHZhbHVlc190byA9ICJzY29yZSIpICU+JSAgIG11dGF0ZShDdXRzPWNhc2Vfd2hlbigoU3Vic2NhbGU9PSJEYXNzMjFfRGVwcmVzc2lvbiIgJiBzY29yZTwxMCkgfiJOb3JtYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSAiRGFzczIxX0RlcHJlc3Npb24iJiBzY29yZTwxNCl+Ik1pbGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSAiRGFzczIxX0RlcHJlc3Npb24iJiBzY29yZTwyMSl+Ik1vZGVyYXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0gIkRhc3MyMV9EZXByZXNzaW9uIiYgc2NvcmU8MjgpfiJTZXZlcmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSAiRGFzczIxX0RlcHJlc3Npb24iJiBzY29yZT4yNyl+IkV4dHJlbWVseV9TZXZlcmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSJEYXNzMjFfQW54aWV0eSImIHNjb3JlPDgpfiJOb3JtYWwiLA0KICAgICAgICAgICAgICAgICAgICAgIChTdWJzY2FsZT09ICJEYXNzMjFfQW54aWV0eSImIHNjb3JlPDEwKX4iTWlsZCIsDQogICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0gIkRhc3MyMV9BbnhpZXR5IiYgc2NvcmU8MTUpfiJNb2RlcmF0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0gIkRhc3MyMV9BbnhpZXR5IiYgc2NvcmU8MjApfiJTZXZlcmUiLA0KICAgICAgICAgICAgICAgICAgICAgIChTdWJzY2FsZT09ICJEYXNzMjFfQW54aWV0eSImIHNjb3JlPjE5KX4iRXh0cmVtZWx5X1NldmVyZSIsDQogICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0iRGFzczIxX1N0cmVzcyImIHNjb3JlPDE1KX4iTm9ybWFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSJEYXNzMjFfU3RyZXNzIiYgc2NvcmU8MTkpfiJNaWxkIiwNCiAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSJEYXNzMjFfU3RyZXNzIiYgc2NvcmU8MjYpfiJNb2RlcmF0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0gIkRhc3MyMV9TdHJlc3MiJiBzY29yZTwzNCl+IlNldmVyZSIsDQogICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0gIkRhc3MyMV9TdHJlc3MiJiBzY29yZT4zMyl+IkV4dHJlbWVseV9TZXZlcmUiKSkNCg0KICANCiNzZXZlcml0eSBoaXN0b2dyYW0gY29sb3JlZCBieSBzZXZlcml0eQ0KZGFzc19zY2F0dGVyICU+JSBnZ3Bsb3QoYWVzKHNjb3JlLGZpbGw9U3Vic2NhbGUsZ3JvdXA9U3Vic2NhbGUpKStnZW9tX2JhcigpDQoNCiNqaXR0ZXIgcGxvdCBjb2xvcmVkIGJ5IHNldmVyaXR5DQpkYXNzX3NjYXR0ZXIgJT4lIGdncGxvdChhZXMoeD1TdWJzY2FsZSx5PXNjb3JlLGNvbG91cj1DdXRzKSkrZ2VvbV9qaXR0ZXIoKSt0aGVtZV9jbGFzc2ljKCkrc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpDQpgYGANCiMgSVNNSTI5DQoyOS1pdGVtIG1lYXN1cmUgYXNzZXNzaW5nIHNlbGYgc3RpZ21hIG9mIG1lbnRhbCBpbGxuZXNzLiBJbmNsdWRlcyBzdWJzY2FsZXM6IGFsaWVuYXRpb24sIHN0ZXJlb3R5cGUgZW5kb3JzZW1lbnQsIGRpc2NyaW1pbmF0aW9uIGV4cGVyaWVuY2UsIHNvY2lhbCB3aXRoZHJhd2FsLCBzdGlnbWEgcmVzaXN0YW5jZS4gU2NvcmVkIGZyb20gMS00LiBUaGUgZW50aXJlIFN0aWdtYSByZXNpc3RhbmNlIHN1YnNjYWxlIGlzIHJldmVyc2Ugc2NvcmVkLg0KDQpUcmFkaXRpb25hbCBzY29yaW5nIGlzIGRpY2hvdG9tb3VzIGFuZCB1c2VzIG1lYW5zLiANCg0KYGBge3IgSVNNSSAyOX0NCmlzbWk8LW1oaHNfZGF0YSAlPiUgc2VsZWN0KGNvbnRhaW5zKCJJU01JIikpDQoNCmlzbWk8LWlzbWkgJT4lIHJvd3dpc2UoKSAlPiUgIA0KICBtdXRhdGUoSVNNSV9BbGllbnRhdGlvbj1zdW0oSVNNSTI5XzEsSVNNSTI5XzUsSVNNSTI5XzgsSVNNSTI5XzE2LElTTUkyOV8xNyxJU01JMjlfMjEpLA0KICAgICAgICAgSVNNSV9TdGVyZT1zdW0oSVNNSTI5XzIsIElTTUkyOV82LElTTUkyOV8xMCxJU01JMjlfMTgsSVNNSTI5XzE5LElTTUkyOV8yMyxJU01JMjlfMjkpLA0KICAgICAgICAgSVNNSV9EaXNjcj1zdW0oSVNNSTI5XzMsSVNNSTI5XzE1LElTTUkyOV8yMixJU01JMjlfMjUsSVNNSTI5XzI4KSwNCiAgICBJU01JX1dpdGhkcmF3YWw9c3VtKElTTUkyOV80LElTTUkyOV85LElTTUkyOV8xMSxJU01JMjlfMTIsSVNNSTI5XzEzLElTTUkyOV8yMCkpICU+JSANCiAgICAgIG11dGF0ZShJU01JMjlfNz1yZWNvZGUoSVNNSTI5XzcsYDFgPTQsYDJgPTMsYDNgPTIsYDRgPTEpLA0KICAgICAgICAgICAgSVNNSTI5XzE0PXJlY29kZShJU01JMjlfMTQsYDFgPTQsYDJgPTMsYDNgPTIsYDRgPTEpLA0KICAgICAgICAgSVNNSTI5XzI0PXJlY29kZShJU01JMjlfMjQsYDFgPTQsYDJgPTMsYDNgPTIsYDRgPTEpLA0KICAgICAgICAgIElTTUkyOV8yNj1yZWNvZGUoSVNNSTI5XzI2LGAxYD00LGAyYD0zLGAzYD0yLGA0YD0xKSwNCiAgICAgICAgIElTTUkyOV8yNz1yZWNvZGUoSVNNSTI5XzI3LGAxYD00LGAyYD0zLGAzYD0yLGA0YD0xKSkgJT4lICANCiAgICAgIG11dGF0ZShJU01JX1N0aWdtYXI9c3VtKElTTUkyOV83LElTTUkyOV8xNCxJU01JMjlfMjQsSVNNSTI5XzI2LElTTUkyOV8yNykpICU+JSANCiAgdW5ncm91cCgpDQoNCg0KI21ha2UgYSBkYXRhZnJhbWUgd2l0aCBvbmx5IHRoZSBpdGVtcyB0byBiZSBzY29yZWQvdGhhdCBuZWVkIHJlbGlhYmlsaXR5DQppc21pX3Njb3Jpbmc8LWlzbWkgJT4lIGRwbHlyOjpzZWxlY3QoSVNNSTI5XzE6SVNNSTI5XzI5KQ0Ka2V5X2lzbWkubGlzdDwtbGlzdChBbGllbj1jKDEsNSw4LDE2LDE3LDIxKSxTdGVyZW90eXBlPWMoMiw2LDEwLDE4LDE5LDIzLDI5KSxEaXNjcmltaW5hdGlvbj1jKDMsMTUsMjIsMjUsMjgpLFdpdGhkcmF3YWw9Yyg0LDksMTEsMTIsMTMsMjApLFN0aWdtYVI9Yyg3LDE0LDI0LDI2LDI3KSkNCg0Ka2V5X2lzbWk8LW1ha2Uua2V5cygyOSxrZXlfaXNtaS5saXN0LGNvbG5hbWVzKGlzbWlfc2NvcmluZykpDQoNCnNjYWxlc19pc21pPC1zY29yZUl0ZW1zKGtleV9pc21pLmxpc3QsaXNtaV9zY29yaW5nKQ0Kc3VtbWFyeShzY2FsZXNfaXNtaSkNCg0KaXNtaSRJU01JMjlfMTQNCmNvcihpc21pJElTTUlfU3RpZ21hcixpc21pJElTTUlfQWxpZW50YXRpb24sdXNlPSJjb21wbGV0ZS5vYnMiKQ0KDQppc21pICU+JSBzZWxlY3QoSVNNSV9BbGllbnRhdGlvbixJU01JX1N0ZXJlLElTTUlfRGlzY3IsSVNNSV9XaXRoZHJhd2FsLElTTUlfU3RpZ21hcikgJT4lIGdhdGhlcigpICU+JSAgZ2dwbG90KGFlcyh5PXZhbHVlLHg9a2V5LGNvbG9yPXZhbHVlKSkrZ2VvbV9ib3hwbG90KCkrZ2VvbV9qaXR0ZXIoKQ0KDQpgYGANCkZvciBzb21lIHJlYXNvbiwgdGhlIHJlc2NvcmVkIHN0aWdtYSByZXNpc3RhbmNlIGlzIGEgbmVnYXRpdmUgY29ycmVsYXRpb24NCg0KIyBEaXN0cmVzcyBEaXNjbG9zdXJlIEluZGV4DQoNClJldmVyc2Ugc2NvcmUgaXRlbXMgMiwgNCwgNSwgOCwgOSwgMTAuIFRoZW4gc3VtIHRoZSAxMiBpdGVtcy4gSGlnaGVyIHNjb3JlcyBpbmRpY2F0ZSBhIGhpZ2hlciB0ZW5kZW5jeSB0byBkaXNjbG9zZSBkaXN0cmVzcywgbG93ZXIgc2NvcmVzIGluZGljYXRlIGdyZWF0ZXIgY29uY2VhbG1lbnQgb2YgZGlzdHJlc3MuDQpgYGB7ciBEREl9DQoNCmRkaTwtbWhoc19kYXRhICU+JSBzZWxlY3QoY29udGFpbnMoIkRESSIpKQ0KDQpkZGk8LWRkaSAlPiUgbXV0YXRlKGFjcm9zcyhjKERESV8yLERESV80LERESV81LERESV84LERESV85LERESV8xMCksfjYtLikpICU+JQ0KICByb3d3aXNlKCkgJT4lIG11dGF0ZShERElfVG90YWw9c3VtKGNfYWNyb3NzKERESV8xOkRESV8xMikpKSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQpkZGlfc2NvcmluZzwtZGRpICU+JSBkcGx5cjo6c2VsZWN0KERESV8xOkRESV8xMikNCg0Ka2V5X2RkaS5saXN0PC1saXN0KFRvdGFsPWMoMToxMikpDQprZXlfZGRpPC1tYWtlLmtleXMoMTIsa2V5X2RkaS5saXN0LGNvbG5hbWVzKGRkaV9zY29yaW5nKSkNCg0Kc2NhbGVzX2RkaTwtc2NvcmVJdGVtcyhrZXlfZGRpLmxpc3QsZGRpX3Njb3JpbmcpDQpzdW1tYXJ5KHNjYWxlc19kZGkpDQoNCmRkaSAlPiUgc2VsZWN0KERESV9Ub3RhbCkgJT4lIGdhdGhlcigpICU+JSAgZ2dwbG90KGFlcyh5PXZhbHVlLHg9a2V5LGNvbG9yPXZhbHVlKSkrZ2VvbV9ib3hwbG90KCkrZ2VvbV9qaXR0ZXIoKQ0KZGRpICU+JSBzZWxlY3QoRERJX1RvdGFsKSAlPiUgYWRkX2NvbHVtbihnaHNxbCAlPiUgc2VsZWN0KFBlcnNvbmFsLFN1aWNpZGUsR2VuZXJhbCxOb25lX2FsbCkpICU+JSBjb3IucGxvdCguKQ0KDQoNCg0KIyBjaGVja2luZyB0aGUgY29ycmVsYXRpb25zIG90IGVuc3VyZSB0aGV5IG1ha2Ugc2Vuc2UNCmNvci50ZXN0KGRkaSRERElfVG90YWwsZ2hzcWwkR2VuZXJhbCkNCmNvci50ZXN0KGRkaSRERElfVG90YWwsZ2hzcWwkUGVyc29uYWwpDQpjb3IudGVzdChkZGkkRERJX1RvdGFsLGdoc3FsJFN1aWNpZGUpDQpjb3IudGVzdChkZGkkRERJX1RvdGFsLGdoc3FsJE5vbmVfYWxsKQ0KDQpgYGANCg0KI0JGTkUNCg0KQ29uc2lzdHMgb2YgMTIgaXRlbXMsIHJhbmdlIDEtNQ0KSXRlbXMgMiwgNCwgNywgYW5kIDEwIGFyZSByZXZlcnNlIHNjb3JlZA0KRm9yd2FyZD0gYygnQkZORV8xJywgJ0JGTkVfMycsICdCRk5FXzUnLCAnQkZORV82JywgICdCRk5FXzgnLCAnQkZORV85JywgJ0JGTkVfMTEnLCAnQkZORV8xMicpLCBSZXZlcnNlPSBjKCdCRk5FXzInLCAnQkZORV80JywgJ0JGTkVfNycsICdCRk5FXzEwJykNCmBgYHtyIEJGTkV9DQpiZm5lPC1taGhzX2RhdGEgJT4lIHNlbGVjdChjb250YWlucygiYmZuZSIpKQ0KDQpiZm5lPC1iZm5lICU+JSBtdXRhdGUoYWNyb3NzKGMoQkZORV8yLEJGTkVfNCxCRk5FXzcsQkZORV8xMCksfjYtLikpDQogICAgICAgICAgICAgICAgICAgICAgDQpiZm5lX3Njb3Jpbmc8LWJmbmUgJT4lIGRwbHlyOjpzZWxlY3QoQkZORV8xOkJGTkVfMTIpDQprZXlfYmZuZS5saXN0PC1saXN0KFRvdGFsPWMoMToxMikpDQprZXlfYmZuZTwtbWFrZS5rZXlzKDEyLGtleV9iZm5lLmxpc3QsY29sbmFtZXMoYmZuZV9zY29yaW5nKSkNCg0Kc2NhbGVzX2JmbmU8LXNjb3JlSXRlbXMoa2V5X2JmbmUubGlzdCxiZm5lX3Njb3JpbmcpDQpzdW1tYXJ5KHNjYWxlc19iZm5lKQ0KDQpgYGANCg0KIyBUcnVzdCByZXNwZWN0IHNjYWxlDQo4IHF1ZXN0aW9ucyAxLXN0cm9uZ2x5IGRpc2FncmVlOyA3IC0gc3Ryb25nbHkgYWdyZWUNCjIsMyw1LDYgcmV2ZXJzZS1zY29yZWQNCg0KYGBge3IgVFJTfQ0KdHJzPC1taGhzX2RhdGEgJT4lIHNlbGVjdChjb250YWlucygidHJzIikpDQoNCnRyczwtdHJzICU+JSBtdXRhdGUoYWNyb3NzKGMoVFJTXzIsVFJTXzMsVFJTXzUsVFJTXzYpLH44LS4pKQ0KDQp0cnNfc2NvcmluZzwtdHJzICU+JSBkcGx5cjo6c2VsZWN0KFRSU18xOlRSU184KQ0Ka2V5X3Rycy5saXN0PC1saXN0KFRvdGFsPWMoMTo4KSkNCmtleV90cnM8LW1ha2Uua2V5cyg4LGtleV90cnMubGlzdCxjb2xuYW1lcyh0cnNfc2NvcmluZykpDQoNCnNjYWxlc190cnM8LXNjb3JlSXRlbXMoa2V5X3Rycy5saXN0LHRyc19zY29yaW5nKQ0Kc3VtbWFyeShzY2FsZXNfdHJzKQ0KDQp0cnMgJT4lIHNlbGVjdChUUlNfMTpUUlNfOCkgJT4lIGdhdGhlcigpICU+JSAgZ2dwbG90KGFlcyh5PXZhbHVlLHg9a2V5LGNvbG9yPXZhbHVlKSkrZ2VvbV9ib3hwbG90KCkrZ2VvbV9qaXR0ZXIoKQ0KDQoNCmBgYA0KDQojIFRydXN0IGluIFBoeXNpY2lhbiBTY2FsZQ0KDQoxIChzdHJvbmdseSBkaXNhZ3JlZSktIDUgKHN0cm9uZ2x5IGFncmVlKQ0KMTEgaXRlbXMsIHVud2VpZ2h0ZWQgbWVhbiBvZiByZXNwb25zZQ0KcmV2ZXJzZSBzY29yZWQgLSAxLCA1LCA3LCAxMQ0Kb3JpZ2luYWwgc2NhbGUgYWxwaGEgPSAuOTANCg0KU3VtbWFyeSBzY29yZSBvZiBtZWRpY2FsIHNrZXB0aWNpc20gd2FzIG9idGFpbmVkIGJ5IHRha2luZyB0aGUgdW53ZWlnaHRlZCBtZWFuIG9mIHRoZSBmb3VyIGl0ZW1zLiANCmBgYHtyIFRQU30NCg0KdHBzPC1taGhzX2RhdGEgJT4lIHNlbGVjdChjb250YWlucygidHBzIikpDQoNCnRwczwtdHBzICU+JSBtdXRhdGUoYWNyb3NzKGMoVFBTXzEsVFBTXzUsVFBTXzcsVFBTXzExKSx+Ni0uKSkgJT4lIA0KICByb3d3aXNlKCkgJT4lIG11dGF0ZShUUFNfVG90PXN1bShjX2Fjcm9zcyhUUFNfMTpUUFNfMTEpKSkgJT4lIA0KICB1bmdyb3VwKCkNCg0KI3NlbGVjdGluZyB0aGUgd3JpdGUtaW5zDQp0cHMgJT4lIGZpbHRlcihUUFNfTyE9IiIpICU+JSBzZWxlY3QoVFBTX08pDQoNCnRwc19zY29yaW5nPC10cHMgJT4lIGRwbHlyOjpzZWxlY3QoVFBTXzE6VFBTXzExKQ0Ka2V5X3Rwcy5saXN0PC1saXN0KFRvdGFsPWMoMToxMSkpDQprZXlfdHBzPC1tYWtlLmtleXMoMTEsa2V5X3Rwcy5saXN0LGNvbG5hbWVzKHRwc19zY29yaW5nKSkNCg0Kc2NhbGVzX3Rwczwtc2NvcmVJdGVtcyhrZXlfdHBzLmxpc3QsdHBzX3Njb3JpbmcpDQpzdW1tYXJ5KHNjYWxlc190cHMpDQoNCnRwcyAlPiUgc2VsZWN0KFRQU18xOlRQU18xMSkgJT4lIGdhdGhlcigpICU+JSAgZ2dwbG90KGFlcyh5PXZhbHVlLHg9a2V5LGNvbG9yPXZhbHVlKSkrZ2VvbV9ib3hwbG90KCkrZ2VvbV9qaXR0ZXIoKQ0KDQoNCg0KYGBgDQojIEV0aG5pYyBJZGVudGl0eSBTY2FsZQ0KDQpyZXZlcnNlIHNjb3JlIDQsNSw4DQoNCmBgYHtyIEVJU30NCmVpczwtbWhoc19kYXRhICU+JSBzZWxlY3QoY29udGFpbnMoImVpcyIpKQ0KDQojIGlkZW50aXR5IHF1ZXN0aW9ucw0KZWlzX2lkPC1laXMgJT4lIHNlbGVjdChFSVNfUkUxOkVJU19IT1JJR0lOXzNfVEVYVCkNCmVpc19yZXNwPC1laXMgJT4lIHNlbGVjdCghRUlTX1JFMTpFSVNfSE9SSUdJTl8zX1RFWFQpDQoNCiMgb2JzZXJ2ZSB0aGUgd3JpdGUtaW5zDQplaXNfaWQgJT4lIGZpbHRlcihFSVNfUkUxXzdfVEVYVCE9IiIpICU+JSBzZWxlY3QoRUlTX1JFMV83X1RFWFQpDQplaXNfaWQgJT4lIGZpbHRlcihFSVNfSE9SSUdJTl8zX1RFWFQhPSIiKSAlPiUgc2VsZWN0KEVJU19IT1JJR0lOXzNfVEVYVCkNCg0KIyBzZWxlY3RpbmcgcmVzcG9uc2VzIG9ubHkNCmVpc19yZXNwPC1laXNfcmVzcCAlPiUgbXV0YXRlKGFjcm9zcyhjKEVJU19FdGhuaV80LEVJU19FdGhuaV81LEVJU19FdGhuaV84KSx+NS0uKSkgJT4lIA0KICByb3d3aXNlKCkgJT4lIG11dGF0ZShFSVNfVG90PXN1bShjX2Fjcm9zcyhFSVNfRXRobmlfMTpFSVNfRXRobmlfOSkpKSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQplaXNfc2NvcmluZzwtZWlzX3Jlc3AgJT4lIGRwbHlyOjpzZWxlY3QoRUlTX0V0aG5pXzE6RUlTX0V0aG5pXzkpDQprZXlfZWlzLmxpc3Q8LWxpc3QoVG90YWw9YygxOjkpKQ0Ka2V5X2VpczwtbWFrZS5rZXlzKDksa2V5X2Vpcy5saXN0LGNvbG5hbWVzKGVpc19zY29yaW5nKSkNCg0Kc2NhbGVzX2Vpczwtc2NvcmVJdGVtcyhrZXlfZWlzLmxpc3QsZWlzX3Njb3JpbmcpDQpzdW1tYXJ5KHNjYWxlc19laXMpDQoNCmVpc19yZXNwICU+JSBzZWxlY3QoRUlTX0V0aG5pXzE6RUlTX0V0aG5pXzkpICU+JSBnYXRoZXIoKSAlPiUgIGdncGxvdChhZXMoeT12YWx1ZSx4PWtleSxjb2xvcj12YWx1ZSkpK2dlb21fYm94cGxvdCgpK2dlb21faml0dGVyKCkNCg0KDQoNCmBgYA0KDQojIEV2ZXJ5ZGF5IEluaXF1aXR5IC0gQ29udGVudA0KYGBge3IgRXZJTn0NCg0KYGBgDQoNCmBgYHtyfQ0KYmljZjwtbWhoc19kYXRhICU+JSBzZWxlY3QoY29udGFpbnMoImJpY2YiKSkNCg0KYGBgDQoNCjEwIGl0ZW1zIDE9c2QgNSA9c2ENCg0KVGhlIG51bWJlcmluZyBpcyBhIGxpdHRsZSBvZGQgb24gdGhlIG9yaWdpbmFsIHNjYWxlLiBUaGVyZSdzIG9ubHkgMTAgaXRlbXMgbnVtYmVyZWQgdG8gMTQuDQo3ID0gNQ0KOCA9IDYNCjExID0gNw0KMTIgPSA4IA0KMTMgPSA5DQoxNCA9IDEwDQpyZXZlcnNlIHNjb3JlIDcsIDgsIDExLCAxMiwgMTMsIDE0IG9ubHkgZm9yIHRvdGFsIHN1YnNjYWxlIG1lYW4NCkhhcm1vbnk6IDEsIDIqLCAzLCA2IEhpZ2hlciBzY29yZXMgbWVhbiBoaWdoZXIgaGFybW9ueSAoYWZmZWN0aXZlKQ0KQ29uZmxpY3Q6IDcsIDgqLCAxMSwgMTIsIDEzLCAxNA0KSXRlbXMgMiBhbmQgOCBhcmUgb25seSBhc2tlZCBmb3IgcGFydGljaXBhbnRzIHdobyBzZWxmLWlkZW50aWZpZWQgYXMgYmljdWx0dXJhbC4NCg0KYGBge3J9DQojS2F5bGVpZ2gncyBhdHRlbXB0IGF0IHNjb3JpbmcgQklDVUxUVVJBTCBJREVOVElUWSBJTlRFR1JBVElPTiBNQVlCRT8gDQoNCmJpY2lpPC1taGhzX2RhdGEgJT4lIHNlbGVjdChjb250YWlucygiYmljaWkiKSkNCg0KQklDSUk8LWJpY2lpICU+JSBtdXRhdGUoYWNyb3NzKGMoQklDSUlfNSxCSUNJSV82LEJJQ0lJXzcsQklDSUlfOCxCSUNJSV85LEJJQ0lJXzEwKSx+Ni0uKSkNCg0KQklDSUlfc2NvcmluZzwtQklDSUkgJT4lIGRwbHlyOjpzZWxlY3QoQklDSUlfMTpCSUNJSV8xMCkNCmtleV9CSUNJSS5saXN0PC1saXN0KFRvdGFsPWMoMToxMCkpDQprZXlfQklDSUk8LW1ha2Uua2V5cygxMCxrZXlfQklDSUkubGlzdCxjb2xuYW1lcyhCSUNJSV9zY29yaW5nKSkNCg0Kc2NhbGVzX0JJQ0lJPC1zY29yZUl0ZW1zKGtleV9CSUNJSS5saXN0LEJJQ0lJX3Njb3JpbmcpDQpzdW1tYXJ5KHNjYWxlc19CSUNJSSkNCg0KDQpgYGANCg0KIyBUb3NjYS0zDQoNCmBgYHtyfQ0KDQpgYGANCg0KIyBSZWxhdGlvbnNoaXAgYXNzZXNzbWVudCBzY2FsZQ0KDQpgYGB7cn0NCg0KYGBgDQoNCiMgU2VsZi1jb25jZWFsbWVudA0KDQpgYGB7cn0NCg0KYGBgDQoNCiMgTUlOSS1JUElQDQoNCiMgQ29tYmluaW5nIHNjYWxlcyBmb3IgcHJvamVjdHMNCg0KYGBge3IgS2F5bGVpZ2ggaG9ub3JzIHByb2plY3R9DQprYXlsZWlnaGRhdGE8LWNiaW5kKG1oaHNfZGF0YSRSZXNwb25zZUlkLG1oaHNfZGVtb3RibCxiaWNpaSxlaXMsZ2hzcWwsaXNtaSx0cnMsdHBzKQ0KI3dyaXRlLmNzdihrYXlsZWlnaGRhdGEsIi4uLzA2LUFuYWx5c2VzLzAzLUtheWxlaWdoL2theWxlaWdoZGF0YS5jc3YiKQ0KYGBgDQoNCg==